7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FAQ担当は今日で引退します。Amazon Bedrock × Lambdaで爆速AIサポートを作ったらヤバかった

7
Last updated at Posted at 2025-12-01

1. はじめに

日々の問い合わせ対応に追われていませんか?

・「また同じ質問がきた…」
・「FAQを作ったのに読んでもらえない…」

そんな悩みは、多くのサービスで共通の“あるある”なワケです。

とはいえ、問い合わせ対応を丸ごとAIに任せるのは難しそう……
そう思っている人も少なくありません。

そこで今回は、Amazon BedrockとAWS Lambdaを組み合わせることで、
FAQ回答をほぼ自動化できる“爆速AIサポート”をどう作れるかを紹介します。

2. 今回使用するAWSサービス

  • AWS Lambda
    サーバーを用意せずにPythonやJavaのコードを実行できる、完全マネージドなサーバーレス実行環境です。
    今回は、Amazon Bedrockに対して質問を送信し、返ってきた回答をJSON形式でレスポンスするために使用します。

  • Amazon Bedrock
    今回の目玉となる、サーバー管理不要で複数の生成AIモデル(Nova、Claude、Llamaなど)をAPI経由で利用できる、生成AIプラットフォームです。

  • Amazon S3
    インターネット上で大容量のデータを安全に保存・管理できるスケーラブルなクラウドストレージサービスです。
    今回は、FAQのお問い合わせ内容とそれに対応する回答をCSV形式で用意し、S3に保存します。
    S3に保存したCSVはナレッジベースに同期され、検索拡張生成(RAG)で利用されます。

  • AWS Identity and Access Management (IAM)
    ユーザーやサービスの権限を管理して、AWS リソースへのアクセスを制御するサービスです。
    今回は、Amazon BedrockやAWS Lambdaのサービスロール設定で使用します。

3. システム構成

今回は、以下の構成でシステムを構築し、AWS LambdaからAmazon Bedrockに対して質問を送信し、正確な回答が返却されることを確認します。
WEBサービスと統合する場合は、API Gatewayなどと連携することで、シームレスなサービス統合が可能です。
Lamdba_Bedrock.drawio.png

4. 構築手順

S3バケットの作成

FAQのお問い合わせ内容とそれに対応する回答をCSV形式で用意し、S3バケット内に格納します。
今回は以下のサンプルCSVを利用します。

question,answer
"返品したい場合はどうすれば良いですか?","商品到着後30日以内であれば返品が可能です。注文番号と併せてカスタマーサポートへご連絡ください。"
"営業時間を教えてください。","店舗の営業時間は毎日10:00〜18:00です。オンラインサポートは24時間受け付けています。"
"送料はいくらですか?","ご注文金額が5,000円以上の場合は送料無料です。5,000円未満の場合は全国一律500円です。"
"支払い方法には何がありますか?","クレジットカード、銀行振込、PayPay、コンビニ払いに対応しています。"
"注文後に配送先を変更できますか?","発送前であれば変更可能です。注文履歴ページから配送先の変更を行うか、サポートにご連絡ください。"
"ギフト包装はできますか?","はい、追加料金300円でギフト包装が可能です。注文時にオプションを選択してください。"
"商品の到着にはどれくらいかかりますか?","通常、注文から2〜3営業日で発送されます。地域によっては到着まで4〜5日かかる場合があります。"

テスト用のバケットを作成し、上記CSVをアップロードします。
スクリーンショット 2025-12-01 193732.png

バケット名は任意の名前で設定します。
スクリーンショット 2025-12-01 180354.png
その他の設定はデフォルトで大丈夫です。

次に、作成したバケットをクリックし、CSVをアップロードします。
スクリーンショット 2025-12-01 180519.png
スクリーンショット 2025-12-01 180537.png

以上でS3の設定は完了です。

Amazon Bedrock ナレッジベースの作成

S3に保存したCSVとナレッジベースを同期し、検索拡張生成(RAG)が利用できるようにします。
マネジメントコンソールのAmazon Bedrockページのメニューから「ナレッジベース」をクリックします。
スクリーンショット 2025-12-01 180651.png

「ベクトルストアを含むナレッジベース」をクリックします。
スクリーンショット 2025-12-01 194917.png

ナレッジベース名は任意の名前で設定します。
スクリーンショット 2025-12-01 181020.png

ランタイムロールは「新しいサービスロールを作成して使用」を、データソースには「Amazon S3」を選択します。
スクリーンショット 2025-12-01 181050.png

次に、「データソース名」を任意の名前で設定し、「S3のURI」には先ほどS3に格納したCSVのURIを設定します。
「S3を参照」をクリックすると格納したCSVが表示され、設定できると思います。
スクリーンショット 2025-12-01 181154.png
その他の設定はデフォルトで大丈夫です。

次に、埋め込みモデルとして「Titan Embeddings G1 - Text」を選択します。
埋め込みモデルとは単語、文章、画像、音声などの人間が理解できる情報を、AIが処理しやすい数字のリスト(ベクトル)」に変換するAIモデルです。
スクリーンショット 2025-12-01 181250.png

次に、ベクトルストアで「Amazon OpenSearch Serverless」を選択し、次へをクリックします。
ベクトルストアとはデータを数字のリスト(べクトル)として保存する「特殊なデータベース」です。
RAGのデータソースもベクトルストアで管理されており、情報を取り出すための「引き出し箱」として使われるイメージです。
スクリーンショット 2025-12-01 181322.png

「ナレッジベースを作成」をクリックします。
※作成完了まで、数分かかると思います。
スクリーンショット 2025-12-01 201224.png

次に、作成したナレッジベースをクリックし、データソースにチェックをいれ、「同期」をクリックします。
データソースであるS3のCSVデータがベクトルに変換されます。
スクリーンショット 2025-12-01 201332.png

ここで一旦テストを実施してみます。
ページ右上の「ナレッジベースをテスト」をクリックします。
「ナレッジベース ID」は後ほど使用しますので、控えておいてください。
スクリーンショット 2025-12-01 202244.png

「取得と応答生成:データソースとモデル」を選択し、「モデルを選択」をクリックします。
スクリーンショット 2025-12-01 182025.png

今回は「Nova Micro」というモデルを使用してみます。
スクリーンショット 2025-12-01 182015.png

モデルを適用後、ページ右側のプロンプトに質問を入力し、エンターをクリックすると「Nova Micro」が生成した答えが返ってきます。
あとは、これをAWS LambdaからAPIで呼び出せばよさそうですね。
スクリーンショット 2025-12-01 203409.png

AWS Lambda関数の作成

Amazon Bedrockに質問を送信し、回答を受信するLambda関数を作成します。

「関数の作成」をクリックします。
スクリーンショット 2025-12-01 182637.png

「関数名」は任意の名前を設定します。
また、今回はランタイムとして「Python3.14」を使用します。
スクリーンショット 2025-12-01 182957.png

実行ロールは新しく作成します。
作成したロールには、後ほどIAMからAmazon Bedrockへのフルアクセス権限ポリシーを追加します。
※本番環境などでは、権限を必要最小限に絞って設定してください。
スクリーンショット 2025-12-01 204045.png

「関数を作成」をクリックします。
スクリーンショット 2025-12-01 204541.png

作成した関数をクリックし、「コード」タブを開き、以下のコードをコピペします。
「knowledgeBaseId」には控えたナレッジベースIDを入力してください。
「modelArn」にはモデル(Nova Micro)のARN(Amazon Resource Name)を入力してください。

import json
import boto3

bedrock_client = boto3.client(
    service_name='bedrock-agent-runtime',
    region_name='ap-northeast-1'
)
    
def lambda_handler(event, context):
    question = event.get('question')

    response = bedrock_client.retrieve_and_generate(
        input={"text": question},
        retrieveAndGenerateConfiguration={
            "type": 'KNOWLEDGE_BASE',
            "knowledgeBaseConfiguration": {
                "knowledgeBaseId": "控えたナレッジベースID",
                "modelArn": "arn:aws:bedrock:ap-northeast-1:ご自身のアカウントID:inference-profile/apac.amazon.nova-micro-v1:0",
            },
        },
    )
    
    text = response["output"]["text"]
    return {
        "statusCode": 200,
        "body": json.dumps({
            "result": response["output"]["text"]
        }, ensure_ascii=False)
    }

IAMロールの設定

自動作成された、AWS Lambdaの実行ロールにAmazon Bedrockのフルアクセス権限を追加します。
AWS Lambda関数の「設定」タブで実行ロールのロール名をクリックします。
スクリーンショット 2025-12-01 205710.png

「許可を追加」から「ポリシーをアタッチ」をクリックします。
スクリーンショット 2025-12-01 205853.png

検索欄で「BedrockFullAccess」と検索し、表示されたポリシーを選択後、「許可を追加」をクリックします。
スクリーンショット 2025-12-01 210027.png

これでIAMロールの設定は完了です。

5. 動作確認

AWS Lambda関数からテストを実施し、適切な回答がJSONで表示されることを確認します。
AWS Lambdaのコンソール画面で「テスト」タブを開き、新しいイベントアクションを作成します。
「イベント名」は任意の名前を設定します。
スクリーンショット 2025-12-01 210407.png

次に、イベントJSONを以下のように設定します。
「question」の中身はご自由に決めてください。

{
    "question": "支払方法は?"
}

image.png

画面右上の「テスト」をクリックし、質問に対する回答が返ってくれば成功です。
スクリーンショット 2025-12-01 210855.png
スクリーンショット 2025-12-01 210943.png

6. 最後に

今回は Amazon Bedrock × Lambda を活用して、爆速AIサポートを作ってみました。
近年ではあらゆるサービスがWebを通じて利用できるようになり、便利さが格段に向上しています。
その一方で、お問い合わせ対応はまだ多くの企業や個人にとって大きな課題です。
AIを活用することで、対応のスピードや品質を格段に向上させることができ、日々の業務負荷も軽減できます。

今回の記事が、AI導入のヒントやアイデアの一助になれば嬉しいです。
最後までお読みいただき、ありがとうございました!

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?